package c05面向对象;

/**
 * final型成员变量必须初始化！否则编译出错！而final型局部变量可以不用初始化。
 * 不管什么final型变量，都没有强制要求定义时就要初始化，但只能初始化一次，且初始化前不能访问，否则编译错误！
 * 只要记住这个，下面的问题就很容易理解了。
 *
 * @author 炜sama
 */
public class final成员变量的初始化 {

	final int i;
	final static int si;

	{
		i = 1;
//		si=1;//虽然可以访问si，但是不能在非静态初始化块里初始化si！因为si属于类，类生命周期中只有一个si，
		//如果在这里面或构造器里面初始化，则每新建一个对象都会初始化一次si！而final变量只能初始化一次！
	}

	static {
//		i=1;//不能引用非static变量i！
		si = 1;
	}

	public final成员变量的初始化() {
//		i=0;
//		si=1;
	}

	public static void main(String[] args) {
		final int i;//局部final变量在定义时如果没有初始化也可以通过编译，但是使用前必须要初始化！否则编译错误！
//		i=0;
//		System.err.println(i);//编译出错！使用前必须要初始化！
	}

}
